<?php
namespace Controllers;

require_once('\Models\LoginModel.php');
require_once('\Models\UserCatalog.php');
require_once('\Models\ManageUsersModel.php');
require_once('\Models\Database.php');
require_once('\Models\DBConfig.php');
require_once('\Common\Strings.php');
require_once('\Views\PageView.php');

class LoginController
{
	/**
	 * Skapa kontroll
	 * @return $html HTML string
	 */
	public function createControl(\Models\Database $db, \Views\LoginView $lv)
	{
		$pv = new \Views\PageView();
		$lm = new \Models\LoginModel();
		$uc = new \Models\UserCatalog();
		$mum = new \Models\ManageUsersModel($db);
		
		if(!$db->Connect(new \Models\DBConfig()))
			return false;
		
		$html = "";
		
		// Kollar om användaren försökt att logga in
		if ($lv->triedToLogin()) 
		{
			// Logga in med angivet användarnamn och lösenord
			$lm->Login($db, $lv->getUserName(), $lv->getPassword());
			
			if($lm->IsLoggedIn())
			{
				$html .= $pv->encapsulateString("p", \Common\Strings::LOGGED_IN_AS ." ". $lm->getUserName());
				
				// Om användaren valt att fortsätta vara inloggad
				if($lv->rememberMe())
				{
					// Hämtar användarens token
					$token = $uc->getTokenFromUser($db, $lm->getUserId());
					$tokenString = $token->Token();
					
					// Sätter cookie med användarens token 
					$lv->setTokenCookie($tokenString);
					
					// Uppdaterar token så att ip-adressen är den senast använda
					$mum->updateToken($token->TokenId(), $_SERVER["REMOTE_ADDR"]);
				}
				else
					$lv->forgetMe();
				
				$html .= $lv->createLogoutBox();
			}
			else
			{
				$html .= $pv->setStatusText(\Common\Strings::LOGIN_INCORRECT, false);
				$html .= $lv->createLoginBox();
			}
		}
		// Kollar om användaren försökt att logga ut
		else if($lv->triedToLogout())
		{
			// Logga ut
			$lm->Logout();
			
			// Ta bort cookie
			$lv->forgetMe();
			
			// Kontrollera att användaren loggats ut
			if($lm->IsLoggedIn() == false)
			{
				$html .= $pv->encapsulateString("p", \Common\Strings::LOGGED_OUT);
				$html .= $lv->createLoginBox();
			}
		}
		// Om användaren varken försökt logga in eller ut
		else
		{
			$tokenString = $lv->getTokenCookie();
			
			// Om användaren har uppgifter sparade
			if($tokenString != null)
			{
				// Hämta användaren via token
				$user = $uc->getUserFromToken($db, $tokenString);
				
				if($user != null)
				{
					$token = $uc->getTokenFromUser($db, $user->UserId());
					
					if($token != null)
					{
						// Logga automatiskt in mha token om det sker från samma dator sedan senaste inloggning
						if($token->Ip() == $_SERVER["REMOTE_ADDR"])
							$lm->setLoggedIn($user->UserId(), $user->UserName());						
					}
				}
					
				// Kontrollera att användaren nu är inloggad
				if($lm->IsLoggedIn())
				{
					$html .= $pv->encapsulateString("p", \Common\Strings::LOGGED_IN_AS ." ". $lm->getUserName());
					$html .= $lv->createLogoutBox();
				}
				else
					$html .= $lv->createLoginBox();
			}
			// Skapa inloggningsruta om ej uppgifter finns sparade
			else
			{
				if(!$lm->IsLoggedIn())
					$html .= $lv->createLoginBox();
				else
				{
					$html .= $pv->encapsulateString("p", \Common\Strings::LOGGED_IN_AS ." ". $lm->getUserName());
					$html .= $lv->createLogoutBox();
				}
			}
		}
		return $html;
	}
}
?>